# 位运算

"""
& | ^  ~ << >>
"""

a = 0b10101
b = 0b01111

print(a & b)

print(a | b)

# 异或：相同为0，不同为1  和 &相反
print(a ^ b)
# 取反：~  :对a的二进制取反
print(~ a)

# 二进制负数表示：反码+1；源码、反码、补码  10101 ->01010->01011
print(bin(~a))
'''
正数：反码、补码就是它本身
1、已知十进制负数，求二进制数
正数的原码->原码取反->加1 ：
2、已知二进制负数，求十进制数
    首先判断是否是二进制数负数依据：看二进制的最高位是1则为负数，0为正数
    二进制（负的）-> 二进制-1 -> 取反 ->原码 ->将源码转成十进制，前面加负号-
'''

'''
1、 ~7 打印的十进制是？ 源码 0000 0111 -> 取反 ：1111 1000  开始转十进制
    取反-1 -> 1111 0111 -> 0000 1000 ->符号-1 ：-8 
2、 -9 的二进制表示? 正数9：0000 1001 -> 反码：1111 0110 ->二进制（+1）：1111 0111   ：
3、 ~-4 打印的十进制是？正数4：0000 0100 -> 反码 1111 1011 -> 二进制(+1): 1111 1100 ->取反 0000 0011  3
4、 1111 1101 的十进制表示：二进制-1： 1111 1100 -> 取反（原码）：0000 0011  -> 加-号： -3
'''
print(int(0b11111010))

print(int(0b11101101))

print("**" * 20)
'''
>> <<
'''
# 左移动变大：8（乘2^n）
print(2 << 2)
# 右移动变小：3 （整除2^n,取整）
print(27 >> 2)
print(29 >> 2)
print(35 >> 2)

print("**" * 20)
# 指数
print(3 ** 4)
print("**" * 20)